﻿package zf.data.ds
{
	/**
	 * 堆栈, 数据将从栈尾进入，从栈尾出去，先进后出
	 * @author Mike.zhang
	 * @langversion 3.0 
	 * @playerversion Flash 9 
	 * 
	 * @see Queue
	 * 
	 */
	public class Stack implements ILinkedList
	{
		private var _list:DLinkedList;
		/**
		 * 创建一个堆栈 
		 * @param list 要创建堆栈的 DLinkedList
		 * @see DLinkedList
		 * 
		 */
		public function Stack (list:DLinkedList=null)
		{
			if (list)
			{
				_list=list;
			}
			else
			{
				_list=new DLinkedList  ;
			}
		}
		/**
		 * 堆栈长度，总计的节点个数 
		 * @return 长度
		 * 
		 */
		public function get length ():uint
		{
			return _list.length;
		}
		/**
		 * 检测堆栈是否为空 
		 * @return 空为true
		 * 
		 */
		public function isEmpty ():Boolean
		{
			return _list.isEmpty();
		}
		/**
		 * 将堆栈转化为数组 
		 * @return 数组
		 * 
		 */
		public function toArray ():Array
		{
			return _list.toArray();
		}
		/**
		 * 清除堆栈中所有节点，使堆栈为空 
		 * 
		 */
		public function clear ():void
		{
			_list.clear ();
		}
		/**
		 * 检查堆栈中是否包含指定的数据 
		 * @param obj 要检查的数据
		 * @return 如果有返回true
		 * 
		 */
		public function contains (obj:*):Boolean
		{
			return _list.contains(obj);
		}
		/**
		 * 查看堆栈头数据 
		 * @return 头数据
		 * 
		 */
		public function peek ():*
		{
			return _list.length > 0?_list.head:null;
		}
		/**
		 * 查看堆栈尾数据 
		 * @return 尾数据
		 * 
		 */
		public function back ():*
		{
			return _list.length > 0?_list.tail:null;
		}
		/**
		 * 压栈，将数据压入堆栈尾 
		 * @param obj 要进入堆栈的数据
		 * 
		 */
		public function push (obj:*):void
		{
			_list.append (obj);
		}
		/**
		 * 出栈，将最后压入的数据弹出 
		 * @return 最后压入堆栈的数据
		 * 
		 */
		public function pop ():*
		{
			return _list.removeTail();
		}
		/**
		 * 返回堆栈的描述信息 
		 * @return 格式[Stack DLinkedList]
		 * 
		 */
		public function toString ():String
		{
			return "[Stack " + _list.toString() + "]";
		}
	}
}